//初识泛型：通俗讲，泛型：就是适用于许多许多类型。从代码上讲，就是对类型实现了参数
//化。
//泛型：类似于C++的模板，也是对类型实现了参数化
public class TestDemo {
    public static void main1(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setArray(0,"hello");
        myArray.setArray(1,90);
       /* String str = myArray.getArray(0);//这个时候返回的是object类型，所以强制转化*/
        String str = (String)myArray.getArray(0);
        System.out.println(str);
        //这样会需要每次获取每个对象都需要进行强转，所以比较不好。
    }

    public static void main(String[] args) {
        MyArray<String> myArray = new MyArray<>();
        myArray.setArray(0,"hello");

        //myArray.setArray(1,90);这里面不能放入整型

        String str = /*(String)*/myArray.getArray(0);//这里可以不用去强转，因为我们在<>指定String类型了
        System.out.println(str);


        MyArray<Integer> myArray2 = new MyArray<>();
        myArray2.setArray(0,1);
        /*
        myArray2.setArray(1,"12333");
        //这个时候是不行的，因为有泛型的存在编译器会自动帮我们检查所存的类型，我们所存的是整型的包装类
        */
        myArray2.setArray(1,10);
        Integer a = myArray2.getArray(0);
        System.out.println(a);
    }
}
//如果我们实现了一个类，类中可以报含了数组的成员，使数组可以存放任何类型的数据

/**
 * 苏派一位了每次获取对象数组的值，去造成强转，所以我们就使用泛型
 * class MyArray{
 *     public Object[] array = new Object[10];
 *
 *     public Object getArray(int pos) {
 *         return array[pos];
 *     }
 *
 *     public void setArray(int pos,Object val) {
 *         array[pos] = val;
 *     }
 * }
 * 上述代码的缺陷：
 * 任何类型都能存放
 * 都需要强制转换
 * 但是，更多情况下，我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。
 */

//所以这时候就引出了泛型：
//泛型的主要目的：就是指定当前的容器，要持有什么类型的对象。让编译器去做检查

/**
 *
  * @param <T>：代表当前类是一个泛型类
 */

class MyArray<T>{//这个时候我们指定类型为均为T的类型，让其返回值也是T型，并且传入的数组成员的类型也是T型
    public Object[] array = new Object[10];

    public T getArray(int pos) {
        return (T)array[pos];
    }

    public void setArray(int pos,T val) {
        array[pos] = val;
    }
}
//泛型就是规定当前容器，要放入哪些类型的对象，并让编译器去检查，在使用直接去规定哪种类型
